.. _cmlIxArcAStart: cmlIxArcAStart ================================ -------------------------------- SYNOPSYS ````````````` .. code-block:: none VT_I4 cmlIxArcAStart ([in] VT_I4 BoardId, [in] VT_I4 MapIndex, [in] VT_R8 XCentOffset, [in] VT_R8 YCentOffset, [in] VT_R8 EndAngle) DESCRIPTION ````````````` - 중심좌표와 ì›í˜¸ì˜ ê°ë„를 매개 변수(媒介變數)ë¡œ 하여 ì›í˜¸ë³´ê°„ì´ë™ì„ 수행합니다. ì´ë•Œ 중심좌표는 ìƒëŒ€ì¢Œí‘œë¡œ 표현ë©ë‹ˆë‹¤. cmlIxArcA() 함수는 ëª¨ì…˜ì´ ì™„ë£Œë˜ê¸° ì „ê¹Œì§€ 반환ë˜ì§€ 않으며, cmlIxArcAStart() 함수는 ëª¨ì…˜ì„ ì‹œìž‘ì‹œí‚¨ í›„ì— ë°”ë¡œ 반환ë©ë‹ˆë‹¤. \ - ì›í˜¸ë³´ê°„ì€ ìž„ì˜ì˜ ë‘ ì¶•ì— ëŒ€í•´ì„œ ì ìš©ë©ë‹ˆë‹¤. 아래 설명ì—서는 ë§µí•‘ëœ ë‘ ì¶•ì„ X, Y축으로 간주하여 설명합니다. 여기서 X축ì´ë¼ í•¨ì€ ë§µí•‘ëœ ë‘ ì¶• 중ì—ì„œ 축번호가 ë‚®ì€ ì¶•ì„ ì˜ë¯¸í•˜ë©° Yì¶•ì€ ì¶•ë²ˆí˜¸ê°€ ë†’ì€ ì¶•ì„ ì˜ë¯¸í•©ë‹ˆë‹¤. 예를 들어 Z축과 Uì¶•ì´ ë§µí•‘ëœ ë‘ ì¶•ì´ë¼ë©´ Zì¶•ì´ Xì¶•ì— í•´ë‹¹í•˜ë©° Uì¶•ì´ Yì¶•ì— í•´ë‹¹í•©ë‹ˆë‹¤. \ - ì´ í•¨ìˆ˜ì˜ ì‚¬ìš©ê³¼ í˜¸ì¶œì— ìžˆì–´, ì œê³µëœ ãˆœì»¤ë¯¸ì¡°ì•„ì˜ í•¨ìˆ˜ í—¤ë” Visual Basic ì—서는 í•¨ìˆ˜ì˜ ì²¨ë‘ì–´ cml ê°€ 붙지 않습니다. .. image:: ../../../res/8-4.jpg PARAMETER ````````````` â–¶ BoardId: 사용ìžê°€ ì„¤ì •í•œ 디바ì´ìŠ¤(ë³´ë“œ) ID. â–¶ MapIndex : 맵번호(Map index), ì´ ë§µë²ˆí˜¸ë¥¼ ì‚¬ìš©í•˜ê¸°ì „ì— ë¨¼ì € cmlIxMapAxes() 함수를 통하여 해당 ë§µë²ˆí˜¸ì— ìœ íš¨í•œ ì¶•ë“¤ì´ ë§µí•‘ë˜ì–´ 있어야 합니다. â–¶ XCentOffset : 현재 위치(시작 위치)로부터 ì›ì˜ 중심까지 X축 ìƒëŒ€ì¢Œí‘œê°’. ê±°ë¦¬ì˜ ë‹¨ìœ„ëŠ” “Unit distanceâ€ì— ì˜í•´ ì •ì˜ë˜ëŠ” 논리ì 거리를 ì 용합니다. â–¶ YCentOffset : 현재 위치(시작 위치)로부터 ì›ì˜ 중심까지 Y축 ìƒëŒ€ì¢Œí‘œê°’. ê±°ë¦¬ì˜ ë‹¨ìœ„ëŠ” “Unit distanceâ€ì— ì˜í•´ ì •ì˜ë˜ëŠ” 논리ì 거리를 ì 용합니다. â–¶ EndAngle : ì›í˜¸ë³´ê°„ ì´ë™ì„ ì™„ë£Œí• ëª©í‘œì§€ì ì˜ í˜„ìž¬ ìœ„ì¹˜ì— ëŒ€í•œ ê°ë„ê°’ì„ Degree(°)값으로 ì§€ì •í•©ë‹ˆë‹¤. ê°ë„ì˜ ë¶€í˜¸ê°€ (+)ì´ë©´ 반시계방향, (-)ì´ë©´ ì‹œê³„ë°©í–¥ìœ¼ë¡œì˜ ì´ë™ì„ ì˜ë¯¸í•©ë‹ˆë‹¤. â–¶ IsBlocking : 완료ë 때까지 기다리는 ë™ì•ˆ 윈ë„ìš° 메시지를 블ë¡(Blocking)í• ê²ƒì¸ì§€ë¥¼ ê²°ì •í•©ë‹ˆë‹¤. .. csv-table:: :widths: 10 90 :header-rows: 1 :stub-columns: 0 Value, Meaning "| 0 ë˜ëŠ” cmlFALSE", " | 블ë¡(Blocking)ì„ í•˜ì§€ 않습니다. ë”°ë¼ì„œ 해당 ëª¨ì…˜ì´ | 완료ë˜ëŠ” ë™ì•ˆì—ë„ ìœˆë„ìš° ì´ë²¤íŠ¸ë¥¼ 처리합니다." "| 1 ë˜ëŠ” cmlTRUE"," | 블ë¡(Blocking)ì„ í•©ë‹ˆë‹¤. ë”°ë¼ì„œ 해당 ëª¨ì…˜ì´ ì™„ë£Œë˜ëŠ” | ë™ì•ˆì—는 윈ë„ìš° ì´ë²¤íŠ¸ê°€ 처리ë˜ì§€ 않습니다." RETURN VALUE ````````````` +------------+-----------+ | Value | Meaning | +============+===========+ | ìŒìˆ˜ | 수행 실패 | +------------+-----------+ | ERR_NONE | 수행 성공 | +------------+-----------+ REFERENCE ``````````````` - cmlIxArcAStart() 함수를 사용하는 경우ì—는 cmlIxIsDone() 함수나 cmlIxWaitDone() 함수를 사용하여 ëª¨ì…˜ì˜ ì™„ë£Œë¥¼ 확ì¸(確èª)í• ìˆ˜ 있습니다. \ - cmlIxArcA() 함수를 사용하는 경우ì—는 내부ì 으로 루프를 수행하면서 ëª¨ì…˜ì´ ì™„ë£Œë˜ê¸°ë¥¼ 기다리는ë°, ì´ë•Œ “Blocking Modeâ€ì„¤ì •ì— ë”°ë¼ ìœˆë„ìš° ì´ë²¤íŠ¸ë¥¼ 처리하는 ë°©ì‹ì´ 달ë¼ì§‘니다. 그러나 ì¼ë°˜ì 으로 윈ë„ìš°ì˜ ìž‘ì—… ì“°ë ˆë“œ(Work Thread) ì—서는 블ë¡ëª¨ë“œë¥¼ 사용하여, 함수내부ì—ì„œ ì§€ì—°ì—†ì´ ì“°ë ˆë“œ ë‚´ë¶€ì˜ ìž‘ì—…ì— ì§‘ì¤‘í• ìˆ˜ 있ë„ë¡ ì„¤ì •í•˜ëŠ” ê²ƒì´ ë°”ëžŒì§í•©ë‹ˆë‹¤. \ - cmlIxArcA() 함수를 사용하는 경우ì—는 INP ìž…ë ¥ì‹ í˜¸ê°€ Enableë¡œ ì„¤ì •ë˜ì—ˆìœ¼ë©´ Command 펄스 ì¶œë ¥ì´ ì™„ë£Œë˜ì–´ë„ INP ìž…ë ¥ì´ ONì´ ë˜ê¸° ì „ê¹Œì§€ëŠ” ëª¨ì…˜ì´ ì™„ë£Œë˜ì§€ ì•Šì€ ê²ƒìœ¼ë¡œ 간주ë˜ì–´ 반환ë˜ì§€ 않습니다. .. note:: "윈ë„ìš° ì´ë²¤íŠ¸ë¼ëŠ” ê²ƒì€ ë¬´ì—‡ìž…ë‹ˆê¹Œ?" 윈ë„ìš° ìš´ì˜ì²´ì œëŠ” Event Driven í˜¹ì€ Message Driven ë°©ì‹1ì˜ êµ¬ì¡°ë¡œ ë˜ì–´ 있습니다. ê° ì‘ìš©í”„ë¡œê·¸ëž¨ì€ ë©”ì‹œì§€ í(Queue)를 ê°€ì§€ê³ ìžˆìœ¼ë©°, ì •í™•ížˆ ë§í•˜ë©´, 메시지를 사용해 ì´ë²¤íŠ¸ë¥¼ 통지하는 ë°©ì‹ìœ¼ë¡œ 설계ë˜ì–´ 있습니다. 윈ë„ìš° 메시지를 처리한다는 ê²ƒì€ ë©”ì‹œì§€ íì—ì„œ 메시지를 하나씩 꺼내서 윈ë„ìš° í”„ë¡œì‹œì €ì— ì „ì†¡í•œë‹¤ëŠ” ê²ƒì„ ì˜ë¯¸í•˜ë©°, ì´ê²ƒì€ ê·¸ í–‰ì„ ì§€ê°€ ë˜ëŠ” 윈ë„ìš°ì— ì „ì†¡ë˜ì–´ 처리ë©ë‹ˆë‹¤. EXAMPLE ````````` - 본 ì˜ˆì œëŠ” 아래 그림과 ê°™ì´ ì§ì„ ë³´ê°„ ì´ë™ê³¼ ì›í˜¸ë³´ê°„ ì´ë™ì„ 조합하는 Coordinated Motionì„ ìˆ˜í–‰í•˜ëŠ” ì˜ˆì œìž…ë‹ˆë‹¤. P1ì 으로부터 출발하여 P8ì ì„ ê±°ì³ ë‹¤ì‹œ P1으로 복귀하는 작업입니다. .. image:: ../../../res/8-5.jpg .. code-block:: c++ :linenos: :emphasize-lines: 5 C/C++ #include "ComiMLink2_SDK.h" #include "ComiMLink2_SDK_Def.h" // BoardID는 0으로 ì„ ì–¸ë˜ì—ˆë‹¤ê³ ê°€ì •í•¨ /*************************************************************** * OnProgramInitial : ì´ í•¨ìˆ˜ëŠ” ê°€ìƒì˜ 함수로서 프로그램 초기화 ë£¨í‹´ì´ * ì ìš©ë˜ëŠ” ë¶€ë¶„ì„ ì˜ë¯¸í•©ë‹ˆë‹¤. ***************************************************************/ void OnProgramInitial() { } long m_nNumDevices; long m_DeviceList[16]; long m_nNumAxes; cmlLoadDll(); if(cmlGnLoadDevice(&m_nNumDevices, m_DeviceList, &m_nNumAxes)!= ERR_NONE) { //Handle ì€ ì‚¬ìš©ìžê°€ ìƒì„±í•œ í¼ì˜ 핸들 값입니다. // ì—러메시지 ì¶œë ¥ return; } /*************************************************************** * OnSetSpeed : ì´ í•¨ìˆ˜ëŠ” ì†ë„ì„¤ì •ì˜ ë³€ê²½ì´ í•„ìš”í• ë•Œ * 호출ë˜ëŠ” ê°€ìƒì˜ 함수 입니다. ***************************************************************/ #define MAP0 0 //맵번호 (0) #define MAP1 1 //맵번호 (1) void OnSetSpeed() { cmlIxMapAxes(DEV0, MAP0, cmlX1_MASK | cmlY1_MASK, cmlIX_MODE_LINEAR); cmlIxMapAxes(DEV0, MAP1, cmlX1_MASK | cmlY1_MASK, cmlIX_MODE_CIRCULAR); //ë˜ëŠ” cmlIxMapAxes(DEV0, MAP0, 0x3, cmlIX_MODE_LINEAR); // cmlIxMapAxes(DEV0, MAP1, 0x3, cmlIX_MODE_CIRCULAR); //ë³´ê°„ ì´ë™í• ì¶•ë“¤ì˜ ê¸°ë³¸ì†ë„를 ì„¤ì •í•©ë‹ˆë‹¤. cmlCfgSetSpeedPattern(DEV0, cmX1, cmlSMODE_T, 1000, 5000, 5000,0,0); cmlCfgSetSpeedPattern(DEV0, cmcY1, cmcSMODE_T, 1000, 5000, 5000,0,0); } /************************************************************** * OnDoMotion() : ìž‘ì—…ëª…ë ¹ì‹œì— í˜¸ì¶œë˜ëŠ” ê°€ìƒì˜ 함수 **************************************************************/ void OnDoMotion() { double fDistList[2]; //MAP0를 마스터 ì†ë„ 모드, Trapezoidal ì†ë„ 패턴으로 ìž‘ì—…ì†ë„ì˜ 100%, //ê°€ì†ë„ì˜ 70%, ê°ì†ë„ì˜ 70%ë¡œ ì„¤ì • 합니다. cmlIxSetSpeedPattern(BoardID, MAP0, cmlFALSE, cmlMODE_T, 0,0,100, 70, 70 ); cmlIxSetSpeedPattern(BoardID, MAP1, cmlFALSE, cmcMODE_T, 0,0,100, 70, 70 ); // Move from P1 to P2 // fDistList[0]=1000; fDistList[1]=0; cmlIxLine(BoardID, MAP0, fDistList, cmlFALSE); // Move from P2 to P3 // cmlIxArcA(BoardID, MAP1, 0, 500, 90, cmlFALSE); // Move from P3 to P4 // fDistList[0]=0; fDistList[1]=1000; cmlIxLine(BoardID, MAP0, fDistList, cmlFALSE); // Move from P4 to P5 // cmlIxArcA(BoardID, MAP1, -500, 0, 90, cmlFALSE); // Move from P5 to P6 // fDistList[0]=-1000; fDistList[1]=0; cmlIxLine(BoardID, MAP0, fDistList, cmlFALSE); // Move from P6 to P7 // cmlIxArcA(BoardID, MAP1, 0, -500, 90, cmlFALSE); // Move from P7 to P8 // fDistList[0]=0; fDistList[1]=-1000; cmlIxLine(BoardID, MAP0, fDistList, cmlFALSE); // Move from P8 to P1 // cmlIxArcA(BoardID, MAP1, 500, 0, 90, cmcFALSE); } .. code-block:: c++ :linenos: Visual Basic „BoardID 는 0으로 ì„ ì–¸ë˜ì—ˆë‹¤ê³ ê°€ì •í•¨ „맵 번호 MAP0ì€ ì´ë¯¸ ì„ ì–¸ë˜ì–´ ìžˆë‹¤ê³ ê°€ì •í•¨. ‘============================================================ ‘GnLoadDevice 함수로 장치를 초기화 합니다. ‘============================================================ Private Sub Form_Load() Dim nTotalDevices As Long Dim DeviceList(16) As Long Dim nTotalAxis As Long Dim IRetVal As Long '============================================================ ' GnLoadDevice 함수로 장치를 초기화합니다. IRetVal = GnLoadDevice(nTotalDevices, DeviceList(0), nTotalAxis) If IRetVal <> ERR_NONE Then MsgBox ("cmlGnLoadDevice has been failed") End If '============================================================ End Sub Private Sub CfgSpeed(nTotalAxis As Long) Dim i As Integer '=========================================================== ' ì´ í•¨ìˆ˜ì—ì„œ CfgSetSpeedPattern 함수로 ì†ë„를 ì„¤ì •í•˜ëŠ” ê²ƒì€ â€˜ ëª¨ë“ ëª¨ì…˜ì˜ ê¸°ì¤€ì†ë„(Standard Speed) ê°€ ë©ë‹ˆë‹¤. ' 단축 구ë™ì„ 비롯한 ëŒ€ë¶€ë¶„ì˜ ëª¨ì…˜ ë™ìž‘ì€ ì´ ê¸°ì¤€ ì†ë„ì˜ ë¹„ìœ¨ë¡œ ë™ìž‘ë˜ê²Œ ‘ ë©ë‹ˆë‹¤. ' 아래 함수는 ì „ì²´ ì¶•ì— ëŒ€í•´ì„œ ìž„ì˜ì˜ 기준 ì†ë„를 ì„¤ì •í•˜ê³ ìžˆìŠµë‹ˆë‹¤. '========================================================== For i = 0 To nTotalAxis-1 Call CfgSetSpeedPattern(BoardID, i, cmlMODE_S, 1000, 2000, 2000,0,0) Next End Sub Private Sub btnMove_Click() Dim nRetVal As Long Dim dXCentOfs As Double Dim dYCentOfs As Double Dim dAngle As Double nRetVal = IxMapAxes(BoardID, MAP0, &H3, cmlIX_MODE_CIRCULAR) If IxSetSpeedPattern(BoardID, MAP0, False, cmlMODE_S,0,0, 100, 100, 100) <> ERR_NONE Then MsgBox ("IxSetSpeedPattern has been failed") End If dXCentOfs = 5000 dYCentOfs = 5000 dAngle = 90 nRetVal = IxArcA(BoardID, MAP0, dXCentOfs, dYCentOfs, dAngle, cmlFALSE) End Sub .. code-block:: c++ :linenos: Delphi //* BoardID는 0으로 ì„ ì–¸ë˜ì—ˆë‹¤ê³ ê°€ì •í•¨ const g_nTargetAxis = 2; MAPINDEX = 0; // * ì´ í•¨ìˆ˜ëŠ” í¼ì´ ìƒì„±ë ë•Œ ì´ë²¤íŠ¸ì— ì˜í•´ ë¶ˆë ¤ì§€ë©° , 장치를 로드하는 함수입 // * 니다. procedure OnCreate(); var g_nDevs : LongInt; DevList : Array[0..15] of LongInt g_nAxis : LongInt; begin // Load ComiMLink2(DLL) Library if ( cmlGnLoadDevice (@g_nDevs, @DevList, @g_nAxis) <> ERR_NONE ) then begin // ë§ˆì§€ë§‰ì— ë°œìƒí•œ ì—러를 í™”ë©´ì— í‘œì‹œí•©ë‹ˆë‹¤. // 함수 ì¸ìžë¡œëŠ” Form ì˜ Handle ì´ ì „ë‹¬ë©ë‹ˆë‹¤. // ì—러메시지 ì¶œë ¥ exit; end end; // * Description : // * // * ìƒëŒ€ 좌표를 목표 위치로 하여 ArcA ì›í˜¸ ë³´ê°„ì„ ìˆ˜í–‰í•©ë‹ˆë‹¤. // * procedure TForm1.btnMoveClick(Sender: TObject); var fWorkSpeedRatio : Double; fAccelSpeedRatio : Double; fDecelSpeedRatio : Double; dXCentOfs : Double; dYCentOfs : Double; dAngle : Double; begin btnMove.Enabled := Boolean(FALSE); // cmlIxMapAxes 함수로 ë³´ê°„ì œì–´ì— í•´ë‹¹í•˜ëŠ” ì¶•ì„ // 그룹(Group) í™” 합니다. // $3 ì˜ ì˜ë¯¸ëŠ” Delphi ì—ì„œ 0x3 ì„ ì˜ë¯¸í•˜ë©°, 해당 ì¶•ì˜ êµ¬ì„±ì€ // 개별 비트를 ì˜ë¯¸í•©ë‹ˆë‹¤. 즉 1번째 비트와 2번째 비트를 ì˜ë¯¸í•˜ë©°, // 해당 비트를 16진수로 ë³´ì•˜ì„ ë•Œì—는 0x3 ì´ ë©ë‹ˆë‹¤. cmlIxMapAxes(BoardID, MAPINDEX,$3, cmlIX_MODE_CIRCULAR); dXCentOfs := 1000; dYCentOfs := 1000; dAngle := 90; // 기준 ì†ë„란 cmlCfgSetSpeedPattern 함수를 통해 ì„¤ì •ëœ ì†ë„를 ì˜ë¯¸í•˜ë©°, // ì•„ëž˜ì˜ cmlIxSetSpeedPattern 함수는 ë³´ê°„ ì¶•ì„ ëŒ€ìƒìœ¼ë¡œ ì¶•ì˜ ì†ë„를 // 기준 ì†ë„ 대비 Percent(%) 단위로 ì„¤ì •í•˜ê³ ìžˆìŠµë‹ˆë‹¤. fAccelSpeedRatio := 100; fDecelSpeedRatio := 100; fWorkSpeedRatio := 100; // ------------------------------------------------------- // ë³´ê°„ì œì–´ì˜ ì†ë„ ëª¨ë“œì— ëŒ€í•´ì„œ 다ìŒê³¼ ê°™ì´ ì„¤ì •í• ìˆ˜ 있습니다. // 아래는 Vecter Speed 모드로 ë™ìž‘하는 ì˜ˆì œìž…ë‹ˆë‹¤. //cmlIxSetSpeedPattern(BoardID, MAPINDEX, cmlTRUE, cmcMODE_S,0,0, 1000, 2000, 2000); // 아래는 Master Speed 모드로 ë™ìž‘하는 ì˜ˆì œìž…ë‹ˆë‹¤. cmlIxSetSpeedPattern(BoardID, MAPINDEX, cmlFALSE, cmlMODE_S, 0,0, fWorkSpeedRatio, fAccelSpeedRatio, fDecelSpeedRatio); // ------------------------------------------------------- // ì›í˜¸ ë³´ê°„ì„ ìˆ˜í–‰í•©ë‹ˆë‹¤. // cmlIxArcA 는 중심좌표와 ì›í˜¸ì˜ ê°ë„를 매개 변수(媒介變數)ë¡œ 하여 //ì›í˜¸ë³´ê°„ì„ ìˆ˜í–‰í•˜ëŠ” 함수입니다. // ì›í˜¸ ë³´ê°„ì‹œì—는 ë‹¤ìŒ 4 가지 ìœ í˜•ì˜ í•¨ìˆ˜ë¥¼ ì‚¬ìš©í• ìˆ˜ 있습니다 // 1. cmlIxArcA : ìƒëŒ€ 거리를 목표로 하여, ì›í˜¸ ë³´ê°„ì´ ì™„ë£Œëœ ìƒíƒœì—ì„œ 함수가 // 반환ë©ë‹ˆë‹¤. // 2. cmlIxArcAStart : ìƒëŒ€ 거리를 목표로 하여, ì›í˜¸ ë³´ê°„ì´ ì‹œìž‘ëœ í›„ 바로 반환ë©ë‹ˆë‹¤. // 3. cmlIxArcATo : ì ˆëŒ€ 거리를 목표로 하여, ì›í˜¸ ë³´ê°„ì´ ì™„ë£Œëœ ìƒíƒœì—ì„œ 함수가 // 반환ë©ë‹ˆë‹¤. // 4. cmlIxArcAToStart : ì ˆëŒ€ 거리를 목표로 하여, ì›í˜¸ ë³´ê°„ì´ ì‹œìž‘ëœ í›„ 바로 // 반환ë©ë‹ˆë‹¤. cmlIxArcA(BoardID, MAPINDEX, dXCentOfs, dYCentOfs, dAngle, cmlFALSE); end;